// 导入http 模块
import http from 'wechat-http'
// 配置项目的基地址
http.baseURL = 'https://live-api.itheima.net'

// 请求拦截器
http.intercept.request = (config) => {
  // config 是请求的相关配置
  console.log(config, '请求的相关配置');
  // 统一为每一个接口配置请求头 值为token
  const token = getApp().token
  // 如果有token的话，就在请求头中添加 Authorization，值为token
  // token 存在 并且 当前调用的接口不是刷新token 接口时，才加上请求 Authorization = token 
  if (token && !config.url.includes('/refreshToken')) {
    // 如果请求头中有token，就使用 header本身，如果没有header，给它赋一个空对象
    config.header = config.header || {}
    // 将token 添加到 请求头中
    config.header.Authorization = token
  }
  return config
}

// 配置响应拦截器
http.intercept.response = async (res) => {
  console.log(res);
  // 判断接口返回的状态码，如果是 401，代表 token 失效
  if (res.statusCode === 401) {
    // 判断，如果刷新token的接口也过期的话，退出登录，跳转登录页
    if (res.config.url.includes('/refreshToken')) {
      // 获取历史栈
      const pageStack = getCurrentPages()
      // 获取当前页的路由地址
      const currentPage = pageStack[pageStack.length - 1]
      // 退出登录，跳转登录页
      wx.redirectTo({
        url: `/pages/login/index?currentUrl=/${currentPage.route}`
      })
      return res.data
    }
    // 调用刷新 token 接口,并以请求头的方式将 refreshToken 传递给后端
    const { code, data } = await wx.http({
      url: '/refreshToken',
      method: 'post',
      header: {
        Authorization: getApp().refreshToken
      }
    })
    // 根据后端返回的请求状态码，判断是否请求成功
    if (code !== 10000) return wx.utils.toast()
    // 把刷新token接口请求回来的数据，保存起来
    getApp().setToken(data.token, data.refreshToken)

    // 重新调用之前401的接口，拿到正确的数据返回
    // 优化出现401，刷新token之后，拿不到数据的问题，此时重新调用接口获取数据，使用户无感知体验
    const result = await wx.http({
      ...res.config
    })
    return result
  }
  // 剥离无用的数据
  return res.data
}

// 将 http 模块挂载到 全局的 wx 对象上
wx.http = http
// 模块导出
export default http